home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Freeware 25 / FreelogHS25.iso / Dessin / ArtOfIllusion2.2.1 / Scripts / Objects / Particle Jet.bsh < prev   
Text File  |  2005-06-11  |  4KB  |  103 lines

  1. /*
  2. <?xml version='1.0' standalone='yes' ?>
  3. <!-- xml header for scripts & plugin manager --> 
  4. <script>
  5.     <name>Particle Jet</name>
  6.     <author>Peter Eastman (peastman@users.sourceforge.net)</author>
  7.     <version>1.8</version>
  8.     <date>09/07/2004</date>
  9.     <description>
  10. This script generates a jet of particles, coming from a circular region in the XZ plane, rising upward, and
  11. then falling back down again. This script is intended to be highly configurable.  You can easily modify it
  12. to change the time during which particles are emitted, their lifespan, the type of object used for each
  13. particle, their starting locations and velocities, and more.
  14.     </description>
  15. </script>
  16. */
  17.  
  18. START_TIME = 0;          // The time at which particles start being emitted
  19. END_TIME = 5;            // The time at which particles stop being emitted
  20. EMISSION_RATE = 10;      // The number of particles emitted per second
  21. LIFETIME = 10;           // The lifetime of each particle
  22. SOURCE_RADIUS = 0.2;     // The radius of the region from which particles are emitted
  23. SOURCE_ANGLE = 15.0;     // The angle formed by the jet
  24. INITIAL_SPEED = 1.0;     // The initial speed of each particle.
  25. JITTER = 0.05;           // Randomizes the initial speed and direction of each particle
  26. GRAVITY = new Vec3(0,-0.2,0);  // The strength and direction of gravity
  27.  
  28. // Comment out the following line if you want the gravity direction to be defined in local coordinates
  29. // rather than scene coordinates.
  30.  
  31. script.getCoordinates().toLocal().transformDirection(GRAVITY);
  32.  
  33. // This function is called to create each particle.  The default implementation simply creates a sphere,
  34. // but you can generate any object you want.  Objects may vary based on their creation time, age, the
  35. // current time (timeCreated+age), location, or velocity.  rand is a random number generator which you can
  36. // use to randomly modify the properties of each particle.  It has already been initialized with a seed
  37. // value that is different for each particle, but constant across all invocations for a given particle.
  38.  
  39. // If this function returns null, the particle will not be shown.  For example, you can cause some
  40. // particles to be omitted altogether (thus making the emission rate non-uniform), or cause them to
  41. // disappear when they reach a certain height.
  42.  
  43. ObjectInfo createParticle(double timeCreated, double age, Vec3 location, Vec3 velocity, Random rand)
  44. {
  45.   sphere = new Sphere(0.05, 0.05, 0.05);
  46.   return new ObjectInfo(sphere, new CoordinateSystem(location, Vec3.vz(), Vec3.vy()), "");
  47. }
  48.  
  49. // Initialize various values that will be used later in the script.
  50.  
  51. time = script.getTime();
  52. gap = 1.0/EMISSION_RATE;
  53. earliest = Math.max(START_TIME, time-LIFETIME);
  54. latest = Math.min(END_TIME, time);
  55. id = (int) Math.ceil(earliest/gap);
  56. emitTime = id*gap;
  57. rand = new Random();
  58. velocityScale = Math.asin(Math.PI*SOURCE_ANGLE/180.0);
  59.  
  60. // Main loop to generate particles.
  61.  
  62. while (emitTime <= latest)
  63. {
  64.   rand.setSeed(id);
  65.   rand.nextInt();
  66.   
  67.   // Select the starting position.
  68.   
  69.   do
  70.   {
  71.     x = 2.0*rand.nextDouble()-1.0;
  72.     z = 2.0*rand.nextDouble()-1.0;
  73.   } while (x*x + z*z > 1.0);
  74.   pos = new Vec3(x*SOURCE_RADIUS, 0.0, z*SOURCE_RADIUS);
  75.   
  76.   // Select the initial velocity.
  77.   
  78.   vel = new Vec3(x*velocityScale, 0.0, z*velocityScale);
  79.   vel.scale(rand.nextDouble());
  80.   vel.y = Math.sqrt(1.0-vel.x*vel.x-vel.z*vel.z);
  81.   vel.x += JITTER*rand.nextDouble();
  82.   vel.y += JITTER*rand.nextDouble();
  83.   vel.z += JITTER*rand.nextDouble();
  84.   vel.normalize();
  85.   vel.scale(INITIAL_SPEED);
  86.   
  87.   // Find the current position and velocity.
  88.   
  89.   age = time-emitTime;
  90.   pos.x += age*(vel.x+0.5*age*GRAVITY.x);
  91.   pos.y += age*(vel.y+0.5*age*GRAVITY.y);
  92.   pos.z += age*(vel.z+0.5*age*GRAVITY.z);
  93.   vel.add(GRAVITY.times(age));
  94.   
  95.   // Create the particle and add it to the object.
  96.   
  97.   obj = createParticle(emitTime, age, pos, vel, rand);
  98.   if (obj != null)
  99.     script.addObject(obj);
  100.   id++;
  101.   emitTime += gap;
  102. }
  103.